/**
 * @description: 加解密封装
 * @version: 0.0.1
 * @author: hxx
 * @Date: 2024年10月25日
 */

import { Provide } from '@midwayjs/core';

import crypto = require('crypto');

@Provide()
export class cryptoUtils {
  /**
   * 加密
   * @param data 数据
   * @param key 密钥
   * @returns 
   */
  async getEncryptData(data: any, key: string) {
    if(!data || !key) return null;
    // 生成一个随机的 16 字节的初始化向量 (IV)
    const iv = Buffer.from(crypto.randomBytes(16));

    // 创建加密实例，使用 AES-256-CBC 算法，提供密钥和初始化向量
    const cipher = crypto.createCipheriv("aes-256-cbc", key, iv);

    // 对输入数据进行加密，并输出加密结果的十六进制表示
    cipher.update(data, "utf-8", "hex");
    const result = cipher.final("hex");
    console.log("加密Encrypt:", result);
    
    return result;
  }

  /**
   * 解密
   * @param data 数据
   * @param key 密钥
   * @returns 
   */
  async getDecryptData(data: string, key: string) {
    if(!data || !key) return null;
    // 生成一个随机的 16 字节的初始化向量 (IV)
    const iv = Buffer.from(crypto.randomBytes(16));
    // 解密
    const de = crypto.createDecipheriv("aes-256-cbc", key, iv);
    de.update(data, "hex");
    const decrypted = de.final("utf-8");
    console.log("解密Decrypted:", decrypted);
    return decrypted;
  }
}